package com.hundsun.cprs.yyt.service.common.service;

import com.hundsun.cprs.yyt.common.exception.ServiceCodeException;
import com.hundsun.cprs.yyt.service.common.dto.*;
import com.hundsun.cprs.yyt.service.common.enums.EnumSmsBizType;
import com.hundsun.cprs.yyt.service.common.query.UserQuery;
import com.hundsun.cprs.yyt.service.common.dto.*;
import com.hundsun.cprs.yyt.service.common.query.UserQuery;

import java.util.List;
import java.util.Map;

public interface RemoteUserService {
	
	/**
	 * 根据用户名，获取用户信息
	 */
	public UserLoginResult getUserMsgByAccount(UserLoginInfo request);
	/**
	 * 根据用户名，获取用户列表
	 */
	public  UserLoginResult getUserListByAccount(UserLoginInfo request);
	/**
	 * 根据用户名，获取用户列表
	 */
	public UserQuery getUserListByAccount(UserQuery request);
	/**
	 * 根据昵称，获取用户列表
	 */
	public  UserLoginResult getUserListByNickName(UserLoginInfo request);
	
	/**
	 * 根据会员ID，获取会员详情
	 * @param userId
	 * @return
	 */
	public UserAccountDTO getUserDetailByUserId(Long userId);
	
    /**
     * 根据会员ID，获取会员详情,竞购系统会缓存该用户信息，若不存在，则发起RPC调用远程接口
     * @param userId
     * @return
     */
    public UserAccountDTO getUserDetailFromCacheByUserId(Long userId);
	/**
	 * 根据会员id，查询直接上级（如居间人或授权服务机构）
	 * @param userId
	 * @return
	 */
	public UserAccountDTO getUpFirstParentByUserId(Long userId);
	/**
	 * 根据会员account值，获取会员详情
	 * @param account
	 * @return
	 */
	public UserAccountDTO getUserDetailByUserAccount(String account);
	
	/**
	 * 根据会员手机号码  获取会员详情
	 * @param phone
	 * @return
	 */
	public UserAccountDTO getUserDetailByPhone(String phone);
	
	   /**
     * 根据会员推广码  获取会员详情
     * @param phone
     * @return
     */
    public UserAccountDTO getUserDetailByFr(String fr);
	
	/**
	 * 修改会员的基本信息
	 * @param userInfo
	 */
	public void modifyUser(UserAccountDTO userInfo);

	/**
	 * 更新用户的交易商等级信息
	 * @param userId
	 * @param mchtLevel
	 * @throws ServiceCodeException
	 */
	public void updateMchtLevel(Long userId,Long mchtLevel) throws ServiceCodeException;
	
	/**
	 * 实名认证
	 * @param userInfo
	 */
	public void realNameVerify(UserAccountDTO userInfo);
	
	/**
	 * 修改会员的登录密码
	 * @param userId
	 * @param oldPwd
	 * @param newPwd
	 */
	public void modifyLoginPwd(Long userId,String oldPwd,String newPwd,String pwdType);
	
	
	/**
	 * 修改会员绑定手机号码
	 * @param userId
	 * @param oldPwd
	 * @param newPwd
	 */
	public void modifyBindMobile(Long userId,String newPhone);
	
	
	/**
	 * 忘记密码场景-重置密码
	 * @param userId
	 * @param newPwd
	 * @param code
	 */
	public void resetPwdByForget(Long userId,String newPwd,String code,String pwdType);
	
	/**
	 * 用户登录接口,包装统一会员的请求参数，提供友好的调用方式
	 * @param account	登录账号
	 * @param password	登录密码
	 * @param loginIp	客户端IP
	 * @return
	 */
	public UserAccountDTO login(String account,String password,String loginIp, String bizType) throws ServiceCodeException;

	/**
	 * 加密用户登录接口,包装统一会员的请求参数，提供友好的调用方式
	 * @param encryptAccount
	 * @param encryptPassword
	 * @param loginIp
	 * @return
	 */
	UserAccountDTO encryptLogin(String encryptAccount, String encryptPassword, String loginIp, String bizType);

	/**
	 * 获取加密后的用户登录信息（账号+密码）
	 * @param userId
	 * @return
	 */
	UserLoginInfoEncryptDto encryptLoginInfo(Long userId);

	/**
	 * token登录
	 * @param sessionToken
	 * @param loginIp
	 * @return
	 */
	UserAccountDTO tokenLogin(String sessionToken, String loginIp);
	/**
	 * 会员快捷注册
	 * @throws ServiceCodeException
	 */
	void register(UserRegisterInfo registerInfo) throws ServiceCodeException;
	/**
	 * 发送注册验证码
	 * @param phone
	 * @param bizType
	 * @throws ServiceCodeException
	 */
	void sendRegCheckCode(String phone) throws ServiceCodeException;
	
	/**
	 * 发送验证码
	 * @param userId	目标会员
	 * @param bizType	验证码分类{@link EnumSmsBizType}
	 * @throws ServiceCodeException
	 */
	void sendCheckCode(Long userId ,String bizType) throws ServiceCodeException;
	
	
	/**
	 * 校验验证码
	 * @param userId		目标会员
	 * @param bizType		验证码分类{@link EnumSmsBizType}
	 * @throws ServiceCodeException
	 */
	void verfiyCheckCode(Long userId ,String bizType,String checkCode) throws ServiceCodeException;
	
	
	/**
	 * 校验手机号码是否唯一
	 * @param userId	可选
	 * @param phone		必填
	 * @return	true - 不存在  false - 已存在
	 * @throws ServiceCodeException
	 */
	boolean checkUniqueOfPhone(Long userId ,String phone) throws ServiceCodeException;

	/**
	 * 校验用户名是否唯一
	 * @param userId
	 * @param account
	 * @return
	 * @throws ServiceCodeException
	 */
	boolean checkUniqueOfAccount(Long userId, String account) throws ServiceCodeException;
	
	/**
	 * 更新会员的头像信息
	 * @param userId           会员ID
	 * @param headImgBase64        新头像(base64编码)
	 * @return                 更新成功后，返回头像URL
	 * @throws ServiceCodeException
	 */
	String updateHeadImgOfUser(Long userId,String headImgBase64) throws ServiceCodeException;
	
	/**
	 * 三方账号绑定校验
	 * @param unionid           用户唯一标识
	 * @param type              用户类型
	 * @return                
	 * @throws ServiceCodeException
	 */
	public ThirdLoginDTO validateBindStatus(String unionid,String type)throws ServiceCodeException;
	
	/**
	 * 三方账号绑定会员
	 * @param userId           会员ID
	 * @param unionid          用户唯一标识
	 * @param type              用户类型
	 * @return                
	 * @throws ServiceCodeException
	 */
	public ThirdLoginDTO bindThirdAccount(Long userId,String unionid,String type)throws ServiceCodeException;

    Map<String,String> getAttrValueContent(String mchtLevel);

	/**
	 * 上传图片
	 * @param imgBase64 base64编码
	 * @return
	 */
	String uploadImg(String imgBase64);

    /**
     * 对接会员的经验值接口
     *
     * */
    EmpiricalChangeInfo changeEmpirical(Long userId,Long empiricalValue);

	/**
	 * 用户退出
	 * @param account
	 * @param sessionToken
	 */
    void logout(String account, String sessionToken);

    /**
	 * 校验支付秘密是否正确
	 * @param userId
	 * @param passwaord
	 *
	 * */
    Boolean checkPassword(Long userId,String passwaord);

    /**
	 * 通过手机号和验证码校验系统是否存在该账号
	 * 不存在则返回token，供三方注册绑定使用
	 * @param account
	 * @param validCode
	 *
	 * */
    Map<String,String> validateAccount(String account,String validCode);
}
